package config

import (
	"fmt"
	"log"

	"github.com/spf13/viper"
)

type Config struct {
	App struct {
		Name    string `yaml: "name"`
		Version string `yaml: "version"`
		Env     string `yaml: "env"`
	} `yaml:"App"`
	Database struct {
		Host     string `yaml:"host"`
		Port     int    `yaml:"port"`
		Username string `yaml:"username"`
		Password string `yaml:"password"`
		Name     string `yaml:"name"`
	} `yaml:"database"`
	Redis struct {
		Addr     string `yaml:"addr"`
		Password string `yaml:"password"`
		DB       int    `yaml:"db"`
	} `yaml:"redis"`
	Server struct {
		Port string `yaml:"port"`
		Mode string `yaml:"mode"`
	} `yaml:"server"`
	JWT struct {
		Secret string `yaml:"secret"`
		Expire int64  `yaml:"expire"`
	}
}

func (c *Config) DSN() string {
	var d = c.Database
	// 构造 DSN 字符串
	var dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
		d.Username,
		d.Password,
		d.Host,
		d.Port,
		d.Name,
	)
	log.Println(dsn)
	return dsn
}

// func LoadConfig() (*Config, error) {
// 	viper.SetConfigName("./config/app")
// 	viper.SetConfigType("yaml")
// 	viper.AddConfigPath(".")

// 	if err := viper.ReadInConfig(); err != nil {
// 		return nil, err
// 	}

// 	var cfg Config
// 	if err := viper.Unmarshal(&cfg); err != nil {
// 		return nil, err
// 	}

// 	return &cfg, nil
// }

func LoadConfig() (*Config, error) {
	v := viper.New()
	var configName = "app"
	// 1. 设置基本配置目录和文件名
	v.SetConfigName(configName)
	v.AddConfigPath("./config")
	v.SetConfigType("yaml")

	// 2. 读取基础配置
	if err := v.ReadInConfig(); err != nil {
		return nil, fmt.Errorf("failed to read base config: %w", err)
	}

	var env = v.GetString("app.env")
	log.Printf("env: %s", env)

	// 3. 根据环境合并对应配置文件
	if env != "" {
		v.SetConfigName(configName + "-" + env) // development 或 production
		if err := v.MergeInConfig(); err != nil {
			log.Printf("Warning: Failed to merge %s config: %v", env, err)
		}
	}

	// 4. 自动绑定环境变量（可选）
	// v.AutomaticEnv()
	// v.SetEnvPrefix("app_")

	var cfg Config
	if err := v.Unmarshal(&cfg); err != nil {
		return nil, fmt.Errorf("failed to unmarshal config: %w", err)
	}

	return &cfg, nil
}
